# __new__内置方法，该方法是为对象在内存分配空间并返回对象引用
# __init__为对象初始化，__new__为对象分配空间
# 重写__new__方法同一个引用即单例模式


class MusicPlayer(object):
    # 定义类属性，记录第一个创建对象的引用
    instance = None

    # 记录是否被初始化，如果初始化将不再初始化
    init_flag = False

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            # 分配空间
            print("创建对象，分配空间")
            cls.instance = super().__new__(cls)
        # 必须返回分配的空间(对象引用)，返回的对象引用传入__init__方法中
        # return super().__new__(cls)
        return cls.instance

    def __init__(self, name) -> None:
        # 使用几次类名创建对象就会调用几次init方法
        # 希望让初始化动作只执行一次
        self.name = name
        if not MusicPlayer.init_flag:
            print("初始化音乐播放器")
            MusicPlayer.init_flag = True


mp = MusicPlayer("网易音乐")
mp2 = MusicPlayer("QQ音乐")
print(mp is mp2)
